package com.neusoft.lohas.modules.shop.web;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.dom4j.DocumentHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.w3c.dom.Document;

import sun.misc.BASE64Decoder;

import com.neusoft.lohas.common.config.Global;
import com.neusoft.lohas.common.pay.payutil.mobile.config.AlipayConfig;
import com.neusoft.lohas.common.pay.payutil.mobile.util.AlipayNotify;
import com.neusoft.lohas.common.pay.upowp.util.DesUtil2;
import com.neusoft.lohas.common.pay.upowp.util.EncDecUtil;
import com.neusoft.lohas.common.pay.upowp.util.RSACoder;
import com.neusoft.lohas.common.web.BaseShopController;
import com.neusoft.lohas.modules.ivm.entity.order.Order;
import com.neusoft.lohas.modules.ivm.enums.order.PayStatusEnum;
import com.neusoft.lohas.modules.ivm.enums.order.PayTypeEnum;
import com.neusoft.lohas.modules.shop.service.ShopService;

@Controller
@RequestMapping(value = "${frontPath}/shops/pay")
public class ShopPayController extends BaseShopController {

	@Autowired
	private ShopService shopService;
	
	/**
	 * 支付宝极简手机网页支付，支付消息接口
	 * @param request
	 * @param response
	 * @param model
	 * @return
	 */
	@RequestMapping(value = "/alipay/notify")
	public String alipayNotify(
			HttpServletRequest request,
			HttpServletResponse response,
			Model model){
		try {
			//获取支付宝POST过来反馈信息
			Map<String,String> params = new HashMap<String,String>();
			Map requestParams = request.getParameterMap();
			for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
				String name = (String) iter.next();
				String[] values = (String[]) requestParams.get(name);
				String valueStr = "";
				for (int i = 0; i < values.length; i++) {
					valueStr = (i == values.length - 1) ? valueStr + values[i]
							: valueStr + values[i] + ",";
				}
				//乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
				//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
				params.put(name, valueStr);
			}
	
			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
			
			//RSA签名解密
		   	if(AlipayConfig.sign_type.equals("0001")) {
		   		params = AlipayNotify.decrypt(params);
		   	}
			//XML解析notify_data数据
			org.dom4j.Document doc_notify_data = DocumentHelper.parseText(params.get("notify_data"));
			
			//商户订单号
			String order_no = doc_notify_data.selectSingleNode( "//notify/out_trade_no" ).getText();
	
			//支付宝交易号
			String trade_no = doc_notify_data.selectSingleNode( "//notify/trade_no" ).getText();
	
			//交易状态
			String trade_status = doc_notify_data.selectSingleNode( "//notify/trade_status" ).getText();
	
			String total_fee = doc_notify_data.selectSingleNode( "//notify/total_fee" ).getText();
			
			String subject = doc_notify_data.selectSingleNode( "//notify/subject" ).getText();
			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
	
			//处理是否已经更改了支付状态
			Order order = shopService.findByOrderNo(order_no);
			if (order.getPayStatus().equals("1")) { //该订单已经支付，则直接返回到一个已经支付的提示页面
				return null;
			}
			order.setTradeNo(trade_no);
			
			if(AlipayNotify.verifyNotify(params) || trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){//验证成功
				//////////////////////////////////////////////////////////////////////////////////////////
				//请在这里加上商户的业务逻辑程序代码
	
				//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
				
				if(trade_status.equals("TRADE_FINISHED")){
					//判断该笔订单是否在商户网站中已经做过处理
						//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
						//如果有做过处理，不执行商户的业务程序
						
					//注意：
					//该种交易状态只在两种情况下出现
					//1、开通了普通即时到账，买家付款成功后。
					//2、开通了高级即时到账，从该笔交易成功时间算起，过了签约时的可退款时限（如：三个月以内可退款、一年以内可退款等）后。
	
					//out.println("success");	//请不要修改或删除
					order.setPayStatus(String.valueOf(PayStatusEnum.PAYED.getStatus()));
				} else if (trade_status.equals("TRADE_SUCCESS")){
					//判断该笔订单是否在商户网站中已经做过处理
						//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
						//如果有做过处理，不执行商户的业务程序
						
					//注意：
					//该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
					
					//out.println("success");	//请不要修改或删除
					order.setPayStatus(String.valueOf(PayStatusEnum.PAYED.getStatus()));
				}
				//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
				shopService.updateOrderStatus(order);
				//////////////////////////////////////////////////////////////////////////////////////////
			}else{//验证失败
				//out.println("fail");
				
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}
	
	@RequestMapping(value = "alipay/callback")
	public String alipayMobile_callback(
			HttpServletRequest request,
			HttpServletResponse response,
			Model model){
		try {
			//获取支付宝GET过来反馈信息
			Map<String,String> params = new HashMap<String,String>();
			Map requestParams = request.getParameterMap();
			for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
				String name = (String) iter.next();
				String[] values = (String[]) requestParams.get(name);
				String valueStr = "";
				for (int i = 0; i < values.length; i++) {
					valueStr = (i == values.length - 1) ? valueStr + values[i]
							: valueStr + values[i] + ",";
				}
				//乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
				valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
				params.put(name, valueStr);
			}

			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
			//商户订单号	String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

			//支付宝交易号	String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

			//交易状态
			String result = new String(request.getParameter("result").getBytes("ISO-8859-1"),"UTF-8");

			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
			
			//处理自定义参数
			//自定义参数用完之后需要移除掉，不然影响验证结果
			String param1 = "";
			String param2 = "";
			String param3 = "";
			String param4 = "";
			String param5 = "";
			String frontUrl = "";
			if (params.containsKey("sid")) {
				param1 = params.get("sid");
				params.remove("sid"); //需要移除掉，不然影响验证结果
			}
			if (params.containsKey("classifyId")) {
				param3 = params.get("classifyId");
				params.remove("classifyId"); 
			}
			if (params.containsKey("shopModel")) {
				param3 = params.get("shopModel");
				params.remove("shopModel"); 
			}
			if (params.containsKey("appId")) {
				param5 = params.get("appId");
				params.remove("appId");
			}
			if (params.containsKey("mobile")) {
				param2 = params.get("mobile");
				params.remove("mobile");
				frontUrl = Global.getWebUrlPath()+Global.getFrontPath()+"?sid="+param1+"&amp;mobile="+param2+"&amp;classifyId="+param3+"&amp;shopModel="+param4+"&amp;appId="+param5;
			}
			if (params.containsKey("mobile")) {
				param1 = params.get("mobile");
				params.remove("mobile"); //需要移除掉，不然影响验证结果
			}
			if (params.containsKey("username")) {
				param2 = params.get("username");
				params.remove("username");
				frontUrl = Global.getWebUrlPath()+Global.getFrontPath()+"/myorder?mobile="+param1+"&amp;username="+param2+"&amp;appId="+param5;
			}
			
			//计算得出通知验证结果
			boolean verify_result = AlipayNotify.verifyReturn(params);
			
			Order order = shopService.findByOrderNo(params.get("out_trade_no"));
			model.addAttribute("order", order);
			if(verify_result){//验证成功
				//////////////////////////////////////////////////////////////////////////////////////////
				//请在这里加上商户的业务逻辑程序代码

				//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
				
			
				//该页面可做页面美工编辑
				//out.println("验证成功<br />");
				
				model.addAttribute("message", "订单编号："+order.getOrderNo()+" 支付成功。");
				model.addAttribute("sysMess", true);
				model.addAttribute("success", true);
				model.addAttribute("frontUrl", frontUrl);
				return "mobile/shop/paySuccess";
				//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

				//////////////////////////////////////////////////////////////////////////////////////////
			}else{
				//该页面可做页面美工编辑
				//out.println("验证失败");
				model.addAttribute("message", "订单编号："+order.getOrderNo()+" 支付失败。");
				model.addAttribute("sysMess", true);
				model.addAttribute("success", false);
				model.addAttribute("frontUrl", frontUrl);
				return "mobile/shop/paySuccess";
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
	@RequestMapping(value = "alipay/app/callback")
	public @ResponseBody Object alipayApp_callback(
			HttpServletRequest request,
			HttpServletResponse response,
			Model model){
		try {
			//获取支付宝GET过来反馈信息
			Map<String,String> params = new HashMap<String,String>();
			Map requestParams = request.getParameterMap();
			for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
				String name = (String) iter.next();
				String[] values = (String[]) requestParams.get(name);
				String valueStr = "";
				for (int i = 0; i < values.length; i++) {
					valueStr = (i == values.length - 1) ? valueStr + values[i]
							: valueStr + values[i] + ",";
				}
				//乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
				valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
				params.put(name, valueStr);
			}
			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
			//商户订单号	
			String out_trade_no = params.get("out_trade_no");

			//支付宝交易号	
			String trade_no = params.get("trade_no");
			
			//交易状态
			String trade_status = params.get("trade_status");

			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
			
			Order order = shopService.findByOrderNo(out_trade_no);
			model.addAttribute("order", order);
			if(trade_status.equals("TRADE_SUCCESS")){//验证成功
				order.setTradeNo(trade_no);
				order.setPayStatus(String.valueOf(PayStatusEnum.PAYED.getStatus()));
				//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
				shopService.updateOrderStatus(order);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "success";
	}
	
	/**
	 * 银联支付完成回调接口
	 * @param request
	 * @param response
	 * @param model
	 * @return
	 */
	@RequestMapping(value = "unionPay/selfUnionPayBack")
	public String selfUnionPayBack(
			HttpServletRequest request,
			HttpServletResponse response,
			Model model){
		String reqXml = "";
		// 得到报文
		try {	
			InputStream inputStream = request.getInputStream();
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
			String tmpStr = "";
			while ((tmpStr = bufferedReader.readLine()) != null) {	
				reqXml += tmpStr;
			}
			bufferedReader.close();
			inputStream.close();
			
			BASE64Decoder decoder=new BASE64Decoder();
			String xml[]=reqXml.split("\\|");
			//获取证书公匙
//			String cerPath = request.getRealPath("/") + "unionpay/802310048993225.cer";
			String cerPath = request.getRealPath("/") + "unionpay/898510148990028.cer";
			String publicKey = EncDecUtil.getPublicCertKey("000000", cerPath);
			//对密钥进行RSA解密
			String mm=RSACoder.decryptByPublicKey(xml[1],publicKey);
			//报文解析
			String wxml=new String(DesUtil2.decrypt(decoder.decodeBuffer(xml[2]),mm.getBytes()),"utf-8");
			System.out.println(wxml);
			//解析xml
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();    
		    DocumentBuilder builder;  
		    String trade_no=null;
		    String order_no=null;
		    String cupsRespCode=null;
		 
		    builder  =  factory.newDocumentBuilder();   
		    Document doc  =  builder.parse( new  ByteArrayInputStream(wxml.getBytes("UTF-8")));
		    //银联交易订单号
		    if(doc.getElementsByTagName("orderId").item(0).getFirstChild()!=null){
		    	trade_no=doc.getElementsByTagName("orderId").item(0).getFirstChild().getNodeValue();
		    }
		    //商户订单号
		    if(doc.getElementsByTagName("merchantOrderId").item(0).getFirstChild()!=null){
		    	order_no=doc.getElementsByTagName("merchantOrderId").item(0).getFirstChild().getNodeValue();
		    }
		    //交易结果编号
		    if(doc.getElementsByTagName("cupsRespCode").item(0).getFirstChild()!=null){
		    	cupsRespCode=doc.getElementsByTagName("cupsRespCode").item(0).getFirstChild().getNodeValue();
		    }
		    Order order = new Order();
		    order.setPayType(String.valueOf(PayTypeEnum.UNIONPAY.getType()));
		    order.setOrderNo(order_no);
		    order.setTradeNo(trade_no);
		    if (cupsRespCode.equals("00")) { //支付成功
		    	order.setPayStatus(String.valueOf(PayStatusEnum.PAYED.getStatus()));
		    	shopService.updateOrderStatus(order);
			}
		} catch (Exception e) {
			e.printStackTrace(); 
		}
		return null;
	}
	
	
	////////微信电商支付--------------------------
	/**
	 * 支付宝极简手机网页支付，支付消息接口
	 * @param request
	 * @param response
	 * @param model
	 * @return
	 */
	@RequestMapping(value = "/alipaywx/notify")
	public String alipayWXNotify(
			HttpServletRequest request,
			HttpServletResponse response,
			Model model){
		try {
			//获取支付宝POST过来反馈信息
			Map<String,String> params = new HashMap<String,String>();
			Map requestParams = request.getParameterMap();
			for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
				String name = (String) iter.next();
				String[] values = (String[]) requestParams.get(name);
				String valueStr = "";
				for (int i = 0; i < values.length; i++) {
					valueStr = (i == values.length - 1) ? valueStr + values[i]
							: valueStr + values[i] + ",";
				}
				//乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
				//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
				params.put(name, valueStr);
			}
	
			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
			
			//RSA签名解密
		   	if(AlipayConfig.sign_type.equals("0001")) {
		   		params = AlipayNotify.decrypt(params);
		   	}
			//XML解析notify_data数据
			org.dom4j.Document doc_notify_data = DocumentHelper.parseText(params.get("notify_data"));
			
			//商户订单号
			String order_no = doc_notify_data.selectSingleNode( "//notify/out_trade_no" ).getText();
	
			//支付宝交易号
			String trade_no = doc_notify_data.selectSingleNode( "//notify/trade_no" ).getText();
	
			//交易状态
			String trade_status = doc_notify_data.selectSingleNode( "//notify/trade_status" ).getText();
	
			String total_fee = doc_notify_data.selectSingleNode( "//notify/total_fee" ).getText();
			
			String subject = doc_notify_data.selectSingleNode( "//notify/subject" ).getText();
			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
	
			//处理是否已经更改了支付状态
			Order order = shopService.findByOrderNo(order_no);
			if (order.getPayStatus().equals("1")) { //该订单已经支付，则直接返回到一个已经支付的提示页面
				return null;
			}
			order.setTradeNo(trade_no);
			
			if(AlipayNotify.verifyNotify(params) || trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){//验证成功
				//////////////////////////////////////////////////////////////////////////////////////////
				//请在这里加上商户的业务逻辑程序代码
	
				//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
				
				if(trade_status.equals("TRADE_FINISHED")){
					//判断该笔订单是否在商户网站中已经做过处理
						//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
						//如果有做过处理，不执行商户的业务程序
						
					//注意：
					//该种交易状态只在两种情况下出现
					//1、开通了普通即时到账，买家付款成功后。
					//2、开通了高级即时到账，从该笔交易成功时间算起，过了签约时的可退款时限（如：三个月以内可退款、一年以内可退款等）后。
	
					//out.println("success");	//请不要修改或删除
					order.setPayStatus(String.valueOf(PayStatusEnum.PAYED.getStatus()));
				} else if (trade_status.equals("TRADE_SUCCESS")){
					//判断该笔订单是否在商户网站中已经做过处理
						//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
						//如果有做过处理，不执行商户的业务程序
						
					//注意：
					//该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
					
					//out.println("success");	//请不要修改或删除
					order.setPayStatus(String.valueOf(PayStatusEnum.PAYED.getStatus()));
				}
				//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
				shopService.updateOrderStatus(order);
				//////////////////////////////////////////////////////////////////////////////////////////
			}else{//验证失败
				//out.println("fail");
				
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}
	
	@RequestMapping(value = "alipaywx/callback")
	public String alipayWXMobile_callback(
			HttpServletRequest request,
			HttpServletResponse response,
			Model model){
		try {
			//获取支付宝GET过来反馈信息
			Map<String,String> params = new HashMap<String,String>();
			Map requestParams = request.getParameterMap();
			for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
				String name = (String) iter.next();
				String[] values = (String[]) requestParams.get(name);
				String valueStr = "";
				for (int i = 0; i < values.length; i++) {
					valueStr = (i == values.length - 1) ? valueStr + values[i]
							: valueStr + values[i] + ",";
				}
				//乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
				valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
				params.put(name, valueStr);
			}

			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
			//商户订单号	String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

			//支付宝交易号	String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

			//交易状态
			String result = new String(request.getParameter("result").getBytes("ISO-8859-1"),"UTF-8");

			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
			
			//处理自定义参数
			//自定义参数用完之后需要移除掉，不然影响验证结果
			int type = 0;
			if (params.containsKey("type")) {
				type = Integer.valueOf(params.get("type"));
				params.remove("type"); //需要移除掉，不然影响验证结果
			}
			//操作中断返回地址
			String url=Global.getWebUrlPath()+Global.getFrontPath()+"/shops";
			String frontUrl = Global.getWebUrlPath();
			if (type>0) {
				frontUrl = url+"/shoping/myOrder/orderList";
			}
			//计算得出通知验证结果
			boolean verify_result = AlipayNotify.verifyReturn(params);
			
			Order order = shopService.findByOrderNo(params.get("out_trade_no"));
			model.addAttribute("order", order);
			if(verify_result){//验证成功
				//////////////////////////////////////////////////////////////////////////////////////////
				//请在这里加上商户的业务逻辑程序代码

				//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
				
			
				//该页面可做页面美工编辑
				//out.println("验证成功<br />");
				
				model.addAttribute("message", "订单编号："+order.getOrderNo()+" 支付成功。");
				model.addAttribute("sysMess", true);
				model.addAttribute("success", true);
				model.addAttribute("frontUrl", frontUrl);
				return "mobile/shop/paySuccess";
				//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

				//////////////////////////////////////////////////////////////////////////////////////////
			}else{
				//该页面可做页面美工编辑
				//out.println("验证失败");
				model.addAttribute("message", "订单编号："+order.getOrderNo()+" 支付失败。");
				model.addAttribute("sysMess", true);
				model.addAttribute("success", false);
				model.addAttribute("frontUrl", frontUrl);
				return "mobile/shop/paySuccess";
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 银联支付完成回调接口
	 * @param request
	 * @param response
	 * @param model
	 * @return
	 */
	@RequestMapping(value = "unionPaywx/selfUnionPayBack")
	public String selfUnionPayWXBack(
			HttpServletRequest request,
			HttpServletResponse response,
			Model model){
		String reqXml = "";
		// 得到报文
		try {	
			InputStream inputStream = request.getInputStream();
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
			String tmpStr = "";
			while ((tmpStr = bufferedReader.readLine()) != null) {	
				reqXml += tmpStr;
			}
			bufferedReader.close();
			inputStream.close();
			
			BASE64Decoder decoder=new BASE64Decoder();
			String xml[]=reqXml.split("\\|");
			//获取证书公匙
//			String cerPath = request.getRealPath("/") + "unionpay/802310048993225.cer";
			String cerPath = request.getRealPath("/") + "unionpay/898510148990028.cer";
			String publicKey = EncDecUtil.getPublicCertKey("000000", cerPath);
			//对密钥进行RSA解密
			String mm=RSACoder.decryptByPublicKey(xml[1],publicKey);
			//报文解析
			String wxml=new String(DesUtil2.decrypt(decoder.decodeBuffer(xml[2]),mm.getBytes()),"utf-8");
			System.out.println(wxml);
			//解析xml
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();    
		    DocumentBuilder builder;  
		    String trade_no=null;
		    String order_no=null;
		    String cupsRespCode=null;
		 
		    builder  =  factory.newDocumentBuilder();   
		    Document doc  =  builder.parse( new  ByteArrayInputStream(wxml.getBytes("UTF-8")));
		    //银联交易订单号
		    if(doc.getElementsByTagName("orderId").item(0).getFirstChild()!=null){
		    	trade_no=doc.getElementsByTagName("orderId").item(0).getFirstChild().getNodeValue();
		    }
		    //商户订单号
		    if(doc.getElementsByTagName("merchantOrderId").item(0).getFirstChild()!=null){
		    	order_no=doc.getElementsByTagName("merchantOrderId").item(0).getFirstChild().getNodeValue();
		    }
		    //交易结果编号
		    if(doc.getElementsByTagName("cupsRespCode").item(0).getFirstChild()!=null){
		    	cupsRespCode=doc.getElementsByTagName("cupsRespCode").item(0).getFirstChild().getNodeValue();
		    }
		    Order order = new Order();
		    order.setPayType(String.valueOf(PayTypeEnum.UNIONPAY.getType()));
		    order.setOrderNo(order_no);
		    order.setTradeNo(trade_no);
		    if (cupsRespCode.equals("00")) { //支付成功
		    	order.setPayStatus(String.valueOf(PayStatusEnum.PAYED.getStatus()));
		    	shopService.updateOrderStatus(order);
			}
		} catch (Exception e) {
			e.printStackTrace(); 
		}
		return null;
	}
	
	
	///PC端电商支付回调
	@RequestMapping(value = "alipaypc/callback")
	public String alipayPCMobile_callback(
			HttpServletRequest request,
			HttpServletResponse response,
			Model model){
		try {
			//获取支付宝GET过来反馈信息
			Map<String,String> params = new HashMap<String,String>();
			Map requestParams = request.getParameterMap();
			for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
				String name = (String) iter.next();
				String[] values = (String[]) requestParams.get(name);
				String valueStr = "";
				for (int i = 0; i < values.length; i++) {
					valueStr = (i == values.length - 1) ? valueStr + values[i]
							: valueStr + values[i] + ",";
				}
				//乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
				valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
				params.put(name, valueStr);
			}

			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
			//商户订单号	String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

			//支付宝交易号	String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

			//交易状态
			String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
			
			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
			
			//处理自定义参数
			//自定义参数用完之后需要移除掉，不然影响验证结果
			int type = 0;
			if (params.containsKey("type")) {
				type = Integer.valueOf(params.get("type"));
				params.remove("type"); //需要移除掉，不然影响验证结果
			}
			//操作中断返回地址
			String url=Global.getWebUrlPath()+"/shops";
			String frontUrl = Global.getWebUrlPath();
			if (type>0) {
				frontUrl = url+"/shoping/myOrder/orderList";
			}
			//计算得出通知验证结果
			boolean verify_result = AlipayNotify.verifyReturn(params);
			
			Order order = shopService.findByOrderNo(params.get("out_trade_no"));
			model.addAttribute("order", order);
			if(trade_status.equals("TRADE_SUCCESS")){
				order.setPayStatus(String.valueOf(PayStatusEnum.PAYED.getStatus()));
				//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
				shopService.updateOrderStatus(order);
			}
			if(verify_result){//验证成功
				//////////////////////////////////////////////////////////////////////////////////////////
				//请在这里加上商户的业务逻辑程序代码

				//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
				
			
				//该页面可做页面美工编辑
				//out.println("验证成功<br />");
				
				model.addAttribute("message", "订单编号："+order.getOrderNo()+" 支付成功。");
				model.addAttribute("sysMess", true);
				model.addAttribute("success", true);
				model.addAttribute("frontUrl", frontUrl);
				return "modules/mall/paySuccess";
				//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

				//////////////////////////////////////////////////////////////////////////////////////////
			}else{
				//该页面可做页面美工编辑
				//out.println("验证失败");
				model.addAttribute("message", "订单编号："+order.getOrderNo()+" 支付失败。");
				model.addAttribute("sysMess", true);
				model.addAttribute("success", false);
				model.addAttribute("frontUrl", frontUrl);
				return "modules/mall/paySuccess";
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
